package cn.bearspark.common.util;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Map;

/**
 * jwt 令牌的工具类
 *
 * @author f
 */
public class JwtUtil {

    /**
     * 设置 jwt 的密钥
     */
    private static final byte[] SECRET_KEY = "bear_spark".getBytes(StandardCharsets.UTF_8);

    /**
     * 设置 jwt 令牌的过期时间（单位：ms），默认是 15 天
     */
    public static final long EXPIRE = 1000 * 60 * 60 * 24 * 15;

    /**
     * 接收业务数据，生成 token 并返回
     * <p>
     * 在构造 jwt 令牌时，使用了 Hs256 算法
     *
     * @param claims 需要保存的数据 map
     * @return jwt 令牌字符串
     */
    public static String createJWT(Map<String, Object> claims) {
        return Jwts.builder()
                // 设置业务数据
                .setClaims(claims)
                // 设置签名使用的 签名算法 和 秘钥
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                // 设置过期时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
                // 构造 jwt 令牌
                .compact();
    }

    /**
     * 接收 token，验证 token，并返回业务数据
     *
     * @param token jwt 令牌字符串
     * @return 保存的数据 map，如果 token 校验失败，则返回 null
     */
    public static Map<String, Object> parseJWT(String token) {
        try {
            return Jwts.parser()
                    // 设置签名的秘钥
                    .setSigningKey(SECRET_KEY)
                    // 设置需要解析的 jwt
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            return null;
        }
    }

}
